리소스 접근하기

Anthropic
Claude에서 열기
이 강좌에 대해 질문하기
노트 복사
LLM용 전체 강좌 노트 복사

MCP의 리소스 기능을 사용하면 서버가 정보 접근을 위한 도구 호출 없이도 데이터를 프롬프트에 직접 포함할 수 있도록 노출할 수 있습니다. 이를 통해 Claude와 같은 AI 모델에 컨텍스트를 더욱 효율적으로 제공할 수 있습니다.

리소스 요청 이해하기

MCP 서버에 리소스를 정의한 후에는 클라이언트가 이를 요청하고 사용할 방법이 필요합니다. 클라이언트는 애플리케이션과 MCP 서버 사이의 가교 역할을 하며, 통신과 데이터 파싱을 자동으로 처리합니다.

흐름은 간단합니다. 사용자가 "@report.pdf"와 같이 문서를 참조하려 할 때, 애플리케이션은 MCP 클라이언트를 사용해 서버에서 해당 리소스를 가져와 Claude에 전송되는 프롬프트에 직접 포함시킵니다.

리소스 읽기 구현하기

핵심 기능은 MCP 클라이언트에 read_resource 함수를 구현하는 것입니다. 이 함수는 가져올 리소스를 식별하는 URI 매개변수를 받습니다:

async def read_resource(self, uri: str) -> Any:
    result = await self.session().read_resource(AnyUrl(uri))
    resource = result.contents[0]

MCP 서버의 응답에는 contents 목록이 포함됩니다. 일반적으로 첫 번째 요소만 필요하며, 이 요소에는 MIME 타입과 같은 메타데이터와 함께 실제 리소스 데이터가 담겨 있습니다.

다양한 콘텐츠 타입 처리하기

리소스는 다양한 유형의 콘텐츠를 반환할 수 있으므로, 클라이언트는 이를 적절히 파싱해야 합니다. MIME 타입을 통해 데이터 처리 방법을 확인할 수 있습니다:

if isinstance(resource, types.TextResourceContents):
    if resource.mimeType == "application/json":
        return json.loads(resource.text)
    
    return resource.text

이 방식을 사용하면 JSON 리소스는 Python 객체로 올바르게 파싱되고, 일반 텍스트 리소스는 문자열로 반환됩니다. MIME 타입은 올바른 파싱 전략을 결정하는 힌트 역할을 합니다.

필요한 임포트

이 기능이 제대로 작동하려면 MCP 클라이언트에 다음 임포트가 필요합니다:

import json
from pydantic import AnyUrl

json 모듈은 JSON 응답 파싱을 처리하고, AnyUrl은 URI 매개변수의 올바른 타입 처리를 보장합니다.

리소스 접근 테스트하기

구현이 완료되면 CLI 애플리케이션을 통해 기능을 테스트할 수 있습니다. "@report.pdf 문서에 무엇이 있나요?"와 같이 입력하면 시스템은 다음을 수행해야 합니다:

  • 자동완성 목록에 사용 가능한 리소스 표시
  • 리소스 선택 허용
  • 리소스 콘텐츠 자동 가져오기
  • 해당 콘텐츠를 Claude에 전달하는 프롬프트에 포함

핵심 장점은 Claude가 프롬프트에서 문서 콘텐츠를 직접 받기 때문에 정보 접근을 위한 도구 호출이 필요 없다는 것입니다. 이를 통해 상호작용이 더 빠르고 효율적으로 이루어집니다.

애플리케이션과의 통합

작성한 MCP 클라이언트 코드는 애플리케이션의 다른 부분에서도 사용됩니다. read_resource 함수는 다른 컴포넌트가 문서 콘텐츠 가져오기, 사용 가능한 리소스 목록 조회, 또는 리소스 데이터를 프롬프트에 통합하는 데 활용할 수 있는 기본 구성 요소가 됩니다.

이러한 관심사의 분리는 코드를 깔끔하게 유지시켜 줍니다. MCP 클라이언트는 서버와의 통신을 담당하고, 애플리케이션 로직은 해당 데이터를 효과적으로 활용하는 방법에 집중합니다.